import { isObject, mergeOptions } from "../utils"

export function initGlobalAPI(Vue) {
  Vue.options = {} // 全局属性，在每个组件初始化的时候 将这些属性放到每个组件上


  Vue.mixin = function (options) { // Vue.mixin会将传入参数options合并到Vue.options中，使用时先Vue.mixin，在初始化vue实例，这是会将Vue.options和初始化实例的options合并
    this.options = mergeOptions(this.options, options);
    return this;
  }
  Vue.extend = function (opt) {
    const Super = this;
    const Sub = function (options) { // 
      this._init(options)
    }
    Sub.prototype = Object.create(Super.prototype); // 继承原型方法
    Sub.prototype.constructor = Sub; // Object.create会产生一个新的实例作为 字类的原型，此时constructor会指向错误
    Sub.options = mergeOptions(Super.options, opt) // 需要让子类能拿到我们Vue定义的全局组件；
    return Sub
  }
  Vue.options.components = {} // 存放全局组件
  Vue.component = function (id, definition) {
    let name = definition.name || id;// 如果name不存在用id
    definition.name = name
    if (isObject(definition)) { // definition是对象用Vue.extend处理，实现extend方法
      definition = Vue.extend(definition); // definioton 这里被赋值为一个函数
    }
    Vue.options.components[name] = definition // 全局存储
  }
  Vue.filter = function (params) {

  }
  Vue.directive = function (params) {

  }
}